package oop;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

/**
 * Lớp xử lý hình ảnh, chuyển động,
 */
public class Sprite {

    private int x, y;       // tọa độ vật hiện tại
    private int height, width;
    private boolean visible = true;
    private int cols, rows; // số frame theo cột, hàng
    private BufferedImage sprite[][];                   // mảng chứa các frame
    private int direction = 0;			// Hướng đang di chuyển, 4 hướng
    private int indexFrame = 0;                 // frame đang sử dụng
    private final int LENGTHFRAME = 4;          // Hiện tai là 4 frame một hướng đi, dành riêng cho entity

    public Sprite(String path) {
        try {

            sprite = new BufferedImage[1][1];
            sprite[0][0] = ImageIO.read(this.getClass().getResourceAsStream(path));
            cols = 1;
            rows = 1;
            height = sprite[0][0].getHeight();
            width = sprite[0][0].getWidth();
        } catch (Exception ex) {
            System.out.println("Entity: " + ex.toString());
        }
    }

    /**
     * Chọn 1 vị trí. có 1 vị trí cắt hình, áp dụng cho chọn 1 hướng
     *
     * @param path
     * @param frameWidth
     * @param frameHeight
     * @param x vi tri x chon cắt
     * @param y vị trí y chọn cắt
     */
    public Sprite(String path, int frameWidth, int frameHeight, int x, int y) {
        try {
            sprite = new BufferedImage[1][1];
            cols = 1;
            rows = 1;
            height = frameHeight;
            width = frameWidth;
            BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream(path));
            sprite[0][0] = image.getSubimage(x, y, frameWidth, frameHeight);
        } catch (Exception ex) {
            System.out.println("Entity: " + ex.toString());
        }

    }

    public Sprite(String path, int frameWidth, int frameHeight) {
        int a = 0, b = 0;
        try {
            height = frameHeight;
            width = frameWidth;
            BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream(path));

            int w = image.getWidth();
            int h = image.getHeight();
            cols = w / frameWidth;
            rows = h / frameHeight;
            sprite = new BufferedImage[rows][cols];

            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    sprite[i][j] = image.getSubimage(a, b, frameWidth, frameHeight);
                    a += frameWidth;
                }
                a = 0;
                b += frameHeight;
            }
        } catch (Exception ex) {
            System.out.println("Entity: " + ex.toString());
        }

    }

    public final void setVisible(boolean visible) {
        this.visible = visible;
    }

    public final boolean isVisible() {
        return visible;
    }

    /**
     * Kiểm tra sự va chạm với các Sprite khác
     *
     * @param other
     * @return
     */
    public boolean collision(Sprite other) {
        if (this.x > other.x && this.x >= other.x + other.width) {
            return false;
        } else if (this.x < other.x && this.x + this.width <= other.x) {
            return false;
        } else if (this.y > other.y && this.y >= other.y + other.height) {
            return false;
        } else if (this.y < other.y && this.y + this.height <= other.y) {
            return false;
        }

        return true;
    }

    public void setFrame(int direction) {
        this.direction = direction;
    }

    public void nextFrame() {
        indexFrame = (++indexFrame) % cols; // 4 hướng di chuyển => LENGTHFRAME == 4
    }

    /**
     * HIển thị frame hiện tại
     *
     * @param x: tọa độ x
     * @param y: tọa độ y
     */
    public void paint(Graphics g, int x, int y) {
        if (!isVisible()) {
            return;
        }
        this.x = x;
        this.y = y;
        g.drawImage(sprite[direction][indexFrame], x, y, null);

    }

//===================================BEGIN-Xử lý người chơi và quái vật=========================//
    /**
     * Cài dặt Frame theo hướng, indexFrame trở về 0
     *
     * @param direction: Hướng đang di chuyển
     * @param attack: tấn công hay không
     */
    public void setFrameE(int direction, boolean attack) {

        this.direction = direction;
        if (!attack) {
            this.indexFrame = 0;
        } else {
            indexFrame = (++indexFrame) % 2 + 4;;
        }

    }

    /**
     * Chuyển frame
     */
    public void nextFrameE() {
        indexFrame = (++indexFrame) % LENGTHFRAME; // 4 hướng di chuyển => LENGTHFRAME == 4
    }

    /**
     * chọn frame đã chết
     */
    public void setDeadE() {
        this.indexFrame = 6;

    }
//===================================END-Xử lý người chơi và quái vật=========================//

}
